﻿using BusinessLayer;
using EntitiesLayer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuidditchWpf.ViewModel
{
    /// <summary>
    /// ViewModel pour la réservation. On stocke les valeurs entrée par l'utilisateur
    /// et les affecte à la réservation seulement lors de la validation du formulaire
    /// </summary>
    public class ReservationViewModel : ViewModelBase
    {
        #region Attributes

        private Reservation reservation;

        private String coupe;

        private String match;

        private String nom;

        private String prenom;

        private String adresse;

        private int places = -1;

        #endregion

        #region Propriétés

        /// <summary>
        /// Nom de la coupe
        /// </summary>
        public String Coupe
        {
            get
            {
                if (String.IsNullOrWhiteSpace(coupe))
                {
                    if (reservation != null && reservation.IDCoupe != 0)
                    {
                        return CoupeManager.Manager.Cups.ToList().Find(cup => cup.ID == reservation.IDCoupe).Name;
                    }
                    else
                        return String.Empty;
                }
                else
                    return coupe;
            }
            set
            {
                coupe = value;
            }
        }

        /// <summary>
        /// Match de la réservation
        /// </summary>
        public String Match
        {
            get
            {
                if (String.IsNullOrWhiteSpace(match))
                {
                    if (reservation.Match != null)
                        // Retourne le match de la réservation
                        return reservation.Match.ID + ":" + reservation.Match.EquipeDomicile.Nom + "/" + reservation.Match.EquipeVisiteuse.Nom;
                    else
                        return String.Empty;
                }
                else
                    return match;
            }
            set
            {
                match = value;
            }
        }

        /// <summary>
        /// Nom du spectateur
        /// </summary>
        public String Nom
        {
            get
            {
                if (String.IsNullOrWhiteSpace(nom))
                {
                    if (reservation.Spectateur != null)
                        // Permet de retourner le nom du spectateur qui a fait la réservation
                        return reservation.Spectateur.Nom;
                    else
                        return String.Empty;
                }
                else
                    return nom;
            }
            set
            {
                nom = value;
            }
        }

        /// <summary>
        /// Prénom du spectateur
        /// </summary>
        public String Prenom
        {
            get
            {
                if (String.IsNullOrWhiteSpace(prenom))
                {
                    if (reservation.Spectateur != null)
                        // Permet de retourner le prénom du spectateur qui a fait la réservation
                        return reservation.Spectateur.Prenom;
                    else
                        return String.Empty;
                }
                else
                    return prenom;
            }
            set
            {
                prenom = value;
            }
        }

        /// <summary>
        /// Adresse du spectateur
        /// </summary>
        public String Adresse
        {
            get
            {
                if (String.IsNullOrWhiteSpace(adresse))
                {
                    if (reservation.Spectateur != null)
                        // Permet de retourner l'adresse du spectateur qui a fait la réservation
                        return reservation.Spectateur.Adresse;
                    else
                        return String.Empty;
                }
                else
                    return adresse;
            }
            set
            {
                adresse = value;
            }
        }

        /// <summary>
        /// Nombre de places réservées
        /// </summary>
        public int Place
        {
            get
            {
                if (places == -1)
                    return reservation.NombrePlacesReserves;
                else
                    return places;
            }
            set
            {
                places = value;
                OnPropertyChanged("Prix");
            }
        }

        /// <summary>
        /// Prix de la réservation. TODO doit être calculé
        /// </summary>
        public float Prix
        {
            get
            {
                return Place * 10f;
            }
        }

        /// <summary>
        ///  ID de la réservation : Clé primaire
        /// </summary>
        public int ID
        {
            get
            {
                return reservation.ID;
            }
            private set
            {
                reservation.ID = value;
                OnPropertyChanged("ID");
            }
        }

        /// <summary>
        ///  Permet de retourner la liste des matches pour la coupe sélectionnée. => IMPT: NOT USED NOW. FINISH TO IMPLEMENTED
        /// </summary>
        public List<String> ListMatchs
        {
            get
            {
                List<String> listMatchName = new List<String>();
                if (reservation != null && reservation.IDCoupe != 0)
                {
                    foreach (Match m in CoupeManager.Manager.Matchs.ToList().FindAll(m => m.CoupeID == reservation.IDCoupe))
                        listMatchName.Add(m.ToString());
                }
                return listMatchName;
            }
        }

        /// <summary>
        /// L'entité Reservation
        /// </summary>
        public Reservation Reservation
        {
            get
            {
                UpdateReservation();
                return reservation;
            }
        }

        /// <summary>
        /// Contrôle et mise à jour de la réservation à l'aide des informations de la vue
        /// </summary>
        /// <returns> La réservation </returns>
        public void UpdateReservation()
        {
            if (reservation != null)
            {
                if (coupe != null)
                {
                    // COUPE
                    reservation.IDCoupe = CoupeManager.Manager.Cups.ToList().Find(cup => cup.Name.Equals(coupe)).ID;
                    OnPropertyChanged("Coupe");
                    OnPropertyChanged("ListMatchs");
                }

                if (match != null)
                {
                    //MATCH
                    String[] table = match.Split(':');
                    int id = Convert.ToInt32(table[0]);
                    reservation.Match = CoupeManager.Manager.Matchs.ToList().Find(m => m.ID == id);
                    OnPropertyChanged("Match");
                }

                if(coupe != null && match != null)
                    reservation.Match.CoupeID = CoupeManager.Manager.Cups.ToList().Find(cup => cup.Name.Equals(coupe)).ID;

                if (nom != null)
                {
                    //SPECTATEUR
                    // NOM
                    // On cherche si un spectateur existe sous ce nom sinon
                    //reservation.Spectateur = CoupeManager.Spectateurs.Find(s => s.Nom.Equals(Nom));
                    if (reservation.Spectateur != null)
                    {
                        reservation.Spectateur.Nom = nom;
                    }
                    else
                    {
                        reservation.Spectateur = new Spectateur(nom, "", "", "", new DateTime(), -1);
                    }
                    OnPropertyChanged("Nom");
                }

                if (reservation.Spectateur != null)
                {
                    if (prenom != null)
                    {
                        //PRENOM
                        reservation.Spectateur.Prenom = prenom;
                        OnPropertyChanged("Prenom");
                    }
                    if(adresse != null)
                    {
                        // ADRESSE
                        reservation.Spectateur.Adresse = adresse;
                        OnPropertyChanged("Adresse");
                    }
                }

                if (places > -1)
                {
                    //PLACES
                    reservation.NombrePlacesReserves = places;
                    OnPropertyChanged("Place");
                }

                OnPropertyChanged("Prix");
            }
        }

        /// <summary>
        /// Vérification du renseignement de tous les champs dans le cas d'un nouvelle réservation
        /// </summary>
        /// <returns> True si tous les champs sont renseignés </returns>
        public bool isFullyInformed()
        {
            if (reservation != null && coupe != null && match != null && nom != null && prenom != null && adresse != null && places != -1)
                return true;
            return false;
        }

        #endregion

        #region Constructeur

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="reservation"> L'entité Reservation à attribuer au ViewModel </param>
        public ReservationViewModel(Reservation reservation)
        {
            this.reservation = reservation;
        }

        /// <summary>
        /// Constructeur d'une nouvelle réservation
        /// </summary>
        public ReservationViewModel()
        {
            this.reservation = new Reservation();
        }
        #endregion
    }
}
